home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_300 / 335_03 / asz8.y < prev    next >
Text File  |  1990-12-02  |  38KB  |  1,684 lines

  1. %{
  2.  
  3. /*
  4. HEADER:     ;
  5. TITLE:         Frankenstein Cross Assemblers;
  6. VERSION:     2.0;
  7. DESCRIPTION: "    Reconfigurable Cross-assembler producing Intel (TM)
  8.         Hex format object records.  ";
  9. KEYWORDS:     cross-assemblers, 1805, 2650, 6301, 6502, 6805, 6809, 
  10.         6811, tms7000, 8048, 8051, 8096, z8, z80;
  11. SYSTEM:     UNIX, MS-Dos ;
  12. FILENAME:     asz8.y;
  13. WARNINGS:     "This software is in the public domain.  
  14.         Any prior copyright claims are relinquished.  
  15.  
  16.         This software is distributed with no warranty whatever.  
  17.         The author takes no responsibility for the consequences 
  18.         of its use.
  19.  
  20.         Yacc (or Bison) required to compile."  ;
  21. SEE-ALSO:     asz8.doc,frasmain.c;    
  22. AUTHORS:     Mark Zenier;
  23. COMPILERS:     Microport Sys V/AT, ATT Yacc, Turbo C V1.5, Bison (CUG disk 285)
  24.         (previous versions Xenix, Unisoft 68000 Version 7, Sun 3);
  25. */
  26. /* z8 instruction generation file */
  27. /* November 17, 1990 */
  28.  
  29. /*
  30.     description    frame work parser description for framework cross
  31.             assemblers
  32.     history        February 2, 1988
  33.             September 11, 1990 - merge table definition
  34.             September 12, 1990 - short file names
  35.             September 14, 1990 - short variable names
  36.             September 17, 1990 - use yylex as external
  37. */
  38. #include <stdio.h>
  39. #include "frasmdat.h"
  40. #include "fragcon.h"
  41.  
  42. #define yylex lexintercept
  43.  
  44. /*
  45.     file        critz8.h
  46.     author        Mark Zenier
  47.     description    Selection criteria and syntax type constants for
  48.             the z8 framework assembler
  49.     usage        Unix
  50.     history        October 28, 1987
  51. */
  52.  
  53. /* 0000.0000.0000.000x   destination register is in working set */
  54. #define    DSTWORK    0x1
  55.  
  56. /* 0000.0000.0000.00x0    destination is double register */
  57. #define DSTDBL    0x2
  58.  
  59. /* 0000.0000.0000.0x00   source register is in working set */
  60. #define SRCWORK    0x4
  61.  
  62. /* 0000.0000.0000.x000    source is double register */
  63. #define SRCDBL    0x8
  64.  
  65. /* type flags for symbol table value for registers */
  66. #define REGFLGSHFT    8
  67. #define REGDFLGSH    REGFLGSHFT
  68. #define REGSFLGSH    (REGFLGSHFT -2)
  69. #define REGFLGS        ((DSTWORK|DSTDBL)<<REGFLGSHFT)
  70. #define REGDEFWRK    (DSTWORK<<REGFLGSHFT)
  71. #define    REGDEFDBL    (DSTDBL<<REGFLGSHFT)
  72. #define REGBITS        0xff
  73. #define REGWORKBITS    0xf
  74.  
  75. #define CPU8600    1    /* use z8 register set */
  76. #define CPU8090    2    /* use UPC register set */
  77. #define ST_CEXP 0x1
  78. #define ST_EXP 0x2
  79. #define ST_INH 0x4
  80. #define ST_IR1 0x8
  81. #define ST_IRIM 0x10
  82. #define ST_IRIR 0x20
  83. #define ST_IRR 0x40
  84. #define ST_R1 0x80
  85. #define ST_R2 0x100
  86. #define ST_REXP 0x200
  87. #define ST_RIMM 0x400
  88. #define ST_RIR 0x800
  89. #define ST_RX 0x1000
  90. #define ST_XR 0x2000
  91. #define ST_IMM 0x1
  92.     
  93.     int cpuselect = CPU8600;
  94.     static char    genbdef[] = "[1=];";
  95.     static char    genwdef[] = "[1=]x";
  96.     char ignosyn[] = "[Xinvalid syntax for instruction";
  97.     char ignosel[] = "[Xinvalid operands";
  98.     int    prevregwork = 0;
  99.     int    regloccnt = 0;
  100.  
  101.     long    labelloc;
  102.     static int satsub;
  103.     int    ifstkpt = 0;
  104.     int    fraifskip = FALSE;
  105.  
  106.     struct symel * endsymbol = SYMNULL;
  107.  
  108. %}
  109. %union {
  110.     int    intv;
  111.     long     longv;
  112.     char    *strng;
  113.     struct symel *symb;
  114. }
  115.  
  116. %token <intv> REGISTER
  117. %token <intv> CONDITION
  118.  
  119. %type <intv> regdefop regoperand
  120.  
  121. %token <intv> KOC_BDEF
  122. %token <intv> KOC_ELSE
  123. %token <intv> KOC_END
  124. %token <intv> KOC_ENDI
  125. %token <intv> KOC_EQU
  126. %token <intv> KOC_IF
  127. %token <intv> KOC_INCLUDE
  128. %token <intv> KOC_ORG
  129. %token <intv> KOC_RESM
  130. %token <intv> KOC_SDEF
  131. %token <intv> KOC_SET
  132. %token <intv> KOC_WDEF
  133. %token <intv> KOC_CHSET
  134. %token <intv> KOC_CHDEF
  135. %token <intv> KOC_CHUSE
  136. %token <intv> KOC_REG
  137. %token <intv> KOC_RREG
  138. %token <intv> KOC_CPU
  139. %token <intv> KOC_opcode
  140. %token <intv> KOC_srp
  141.  
  142. %token <longv> CONSTANT
  143. %token EOL
  144. %token KEOP_AND
  145. %token KEOP_DEFINED
  146. %token KEOP_EQ
  147. %token KEOP_GE
  148. %token KEOP_GT
  149. %token KEOP_HIGH
  150. %token KEOP_LE
  151. %token KEOP_LOW
  152. %token KEOP_LT
  153. %token KEOP_MOD
  154. %token KEOP_MUN
  155. %token KEOP_NE
  156. %token KEOP_NOT
  157. %token KEOP_OR
  158. %token KEOP_SHL
  159. %token KEOP_SHR
  160. %token KEOP_XOR
  161. %token KEOP_locctr
  162. %token <symb> LABEL
  163. %token <strng> STRING
  164. %token <symb> SYMBOL
  165.  
  166. %token KTK_invalid
  167.  
  168. %right    KEOP_HIGH KEOP_LOW
  169. %left    KEOP_OR KEOP_XOR
  170. %left    KEOP_AND
  171. %right    KEOP_NOT
  172. %nonassoc    KEOP_GT KEOP_GE KEOP_LE KEOP_LT KEOP_NE KEOP_EQ
  173. %left    '+' '-'
  174. %left    '*' '/' KEOP_MOD KEOP_SHL KEOP_SHR
  175. %right    KEOP_MUN
  176.  
  177.  
  178. %type <intv> expr exprlist stringlist
  179.  
  180. %start file
  181.  
  182. %%
  183.  
  184. file    :    file allline
  185.     |    allline
  186.     ;
  187.  
  188. allline    :     line EOL
  189.             {
  190.                 clrexpr();
  191.             }
  192.     |    EOL
  193.     |    error EOL
  194.             {
  195.                 clrexpr();
  196.                 yyerrok;
  197.             }
  198.     ;
  199.  
  200. line    :    LABEL KOC_END 
  201.             {
  202.                 endsymbol = $1;
  203.                 nextreadact = Nra_end;
  204.             }
  205.     |          KOC_END 
  206.             {
  207.                 nextreadact = Nra_end;
  208.             }
  209.     |    KOC_INCLUDE STRING
  210.             {
  211.         if(nextfstk >= FILESTKDPTH)
  212.         {
  213.             fraerror("include file nesting limit exceeded");
  214.         }
  215.         else
  216.         {
  217.             infilestk[nextfstk].fnm = savestring($2,strlen($2));
  218.             if( (infilestk[nextfstk].fpt = fopen($2,"r"))
  219.                 ==(FILE *)NULL )
  220.             {
  221.                 fraerror("cannot open include file");
  222.             }
  223.             else
  224.             {
  225.                 nextreadact = Nra_new;
  226.             }
  227.         }
  228.             }
  229.     |    LABEL KOC_EQU expr 
  230.             {
  231.                 if($1 -> seg == SSG_UNDEF)
  232.                 {
  233.                     pevalexpr(0, $3);
  234.                     if(evalr[0].seg == SSG_ABS)
  235.                     {
  236.                         $1 -> seg = SSG_EQU;
  237.                         $1 -> value = evalr[0].value;
  238.                         prtequvalue("C: 0x%lx\n",
  239.                             evalr[0].value);
  240.                     }
  241.                     else
  242.                     {
  243.                         fraerror(
  244.                     "noncomputable expression for EQU");
  245.                     }
  246.                 }
  247.                 else
  248.                 {
  249.                     fraerror(
  250.                 "cannot change symbol value with EQU");
  251.                 }
  252.             }
  253.     |    LABEL KOC_SET expr 
  254.             {
  255.                 if($1 -> seg == SSG_UNDEF
  256.                    || $1 -> seg == SSG_SET)
  257.                 {
  258.                     pevalexpr(0, $3);
  259.                     if(evalr[0].seg == SSG_ABS)
  260.                     {
  261.                         $1 -> seg = SSG_SET;
  262.                         $1 -> value = evalr[0].value;
  263.                         prtequvalue("C: 0x%lx\n",
  264.                             evalr[0].value);
  265.                     }
  266.                     else
  267.                     {
  268.                         fraerror(
  269.                     "noncomputable expression for SET");
  270.                     }
  271.                 }
  272.                 else
  273.                 {
  274.                     fraerror(
  275.                 "cannot change symbol value with SET");
  276.                 }
  277.             }
  278.     |    KOC_IF expr 
  279.             {
  280.         if((++ifstkpt) < IFSTKDEPTH)
  281.         {
  282.             pevalexpr(0, $2);
  283.             if(evalr[0].seg == SSG_ABS)
  284.             {
  285.                 if(evalr[0].value != 0)
  286.                 {
  287.                     elseifstk[ifstkpt] = If_Skip;
  288.                     endifstk[ifstkpt] = If_Active;
  289.                 }
  290.                 else
  291.                 {
  292.                     fraifskip = TRUE;
  293.                     elseifstk[ifstkpt] = If_Active;
  294.                     endifstk[ifstkpt] = If_Active;
  295.                 }
  296.             }
  297.             else
  298.             {
  299.                 fraifskip = TRUE;
  300.                 elseifstk[ifstkpt] = If_Active;
  301.                 endifstk[ifstkpt] = If_Active;
  302.             }
  303.         }
  304.         else
  305.         {
  306.             fraerror("IF stack overflow");
  307.         }
  308.             }
  309.                         
  310.     |    KOC_IF 
  311.             {
  312.         if(fraifskip) 
  313.         {
  314.             if((++ifstkpt) < IFSTKDEPTH)
  315.             {
  316.                     elseifstk[ifstkpt] = If_Skip;
  317.                     endifstk[ifstkpt] = If_Skip;
  318.             }
  319.             else
  320.             {
  321.                 fraerror("IF stack overflow");
  322.             }
  323.         }
  324.         else
  325.         {
  326.             yyerror("syntax error");
  327.             YYERROR;
  328.         }
  329.                 }
  330.                         
  331.     |    KOC_ELSE 
  332.             {
  333.                 switch(elseifstk[ifstkpt])
  334.                 {
  335.                 case If_Active:
  336.                     fraifskip = FALSE;
  337.                     break;
  338.                 
  339.                 case If_Skip:
  340.                     fraifskip = TRUE;
  341.                     break;
  342.                 
  343.                 case If_Err:
  344.                     fraerror("ELSE with no matching if");
  345.                     break;
  346.                 }
  347.             }
  348.  
  349.     |    KOC_ENDI 
  350.             {
  351.                 switch(endifstk[ifstkpt])
  352.                 {
  353.                 case If_Active:
  354.                     fraifskip = FALSE;
  355.                     ifstkpt--;
  356.                     break;
  357.                 
  358.                 case If_Skip:
  359.                     fraifskip = TRUE;
  360.                     ifstkpt--;
  361.                     break;
  362.                 
  363.                 case If_Err:
  364.                     fraerror("ENDI with no matching if");
  365.                     break;
  366.                 }
  367.             }
  368.     |    LABEL KOC_ORG expr 
  369.             {
  370.                 pevalexpr(0, $3);
  371.                 if(evalr[0].seg == SSG_ABS)
  372.                 {
  373.                     locctr = labelloc = evalr[0].value;
  374.                     if($1 -> seg == SSG_UNDEF)
  375.                     {
  376.                         $1 -> seg = SSG_ABS;
  377.                         $1 -> value = labelloc;
  378.                     }
  379.                     else
  380.                         fraerror(
  381.                         "multiple definition of label");
  382.                     prtequvalue("C: 0x%lx\n",
  383.                         evalr[0].value);
  384.                 }
  385.                 else
  386.                 {
  387.                     fraerror(
  388.                      "noncomputable expression for ORG");
  389.                 }
  390.             }
  391.     |          KOC_ORG expr 
  392.             {
  393.                 pevalexpr(0, $2);
  394.                 if(evalr[0].seg == SSG_ABS)
  395.                 {
  396.                     locctr = labelloc = evalr[0].value;
  397.                     prtequvalue("C: 0x%lx\n",
  398.                         evalr[0].value);
  399.                 }
  400.                 else
  401.                 {
  402.                     fraerror(
  403.                      "noncomputable expression for ORG");
  404.                 }
  405.             }
  406.     |    LABEL KOC_CHSET
  407.             {
  408.                 if($1 -> seg == SSG_UNDEF)
  409.                 {
  410.                     $1 -> seg = SSG_EQU;
  411.                     if( ($1->value = chtcreate